package com.atguigu.demo.handler;

import com.atguigu.demo.entity.Movie;
import com.atguigu.demo.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class MovieHandler {

    @Autowired
    private MovieService movieService;

    @RequestMapping("/show/list")
    public String showList(Model model) {

        // 1、调用 Service 方法查询数据
        List<Movie> movieList = movieService.getAll();

        // 2、将数据存入模型
        model.addAttribute("movieList", movieList);

        // 3、返回逻辑视图
        return "movie-list";
    }

    @RequestMapping("/remove/movie")
    public String removeMovie(
            // 接收请求参数
            @RequestParam("movieId") String movieId
    ) {

        // 1、执行删除
        movieService.removeMovieById(movieId);

        // 2、回到显示列表页面
        // ①方案一：直接返回列表页面的逻辑视图名称
        // 效果：页面上没有数据可以显示
        // return "movie-list";

        // ②方案二：查询数据、存入模型，然后再返回逻辑视图名称
        // List<Movie> movieList = movieService.getAll();
        // model.addAttribute("movieList", movieList);
        // return "movie-list";
        // 效果：页面上能够显示数据，但是存在缺陷。
        // 缺陷1：代码冗余。
        // 缺陷2：用户点击删除超链接后，刷新浏览器会重复执行删除操作，而删除操作是没法缓存的。

        // ③方案三：直接调用 showList() 方法
        // return showList(model);
        // 效果：页面上能够显示数据，但是存在缺陷。
        // 缺陷1：破坏了程序的结构。
        // 缺陷2：用户点击删除超链接后，刷新浏览器会重复执行删除操作，而删除操作是没法缓存的。

        // ④方案四：转发到 /show/list 地址
        // return "forward:/show/list";
        // 效果：页面上能够显示数据，但是存在缺陷。
        // 缺陷：用户点击删除超链接后，刷新浏览器会重复执行删除操作，而删除操作是没法缓存的。

        // ⑤方案五：重定向到 /show/list 地址
        // 效果：页面上能够显示数据，而且浏览器地址栏从删除操作地址变成了 /show/list
        // 用户刷新浏览器访问的就是 /show/list 地址，而这个查询操作是可以缓存的。
        return "redirect:/show/list";
    }

    @RequestMapping("/save/movie")
    public String saveMovie(

            // 请求参数名正好对应实体类对象的属性名，此时就可以直接使用实体类接收请求参数
            Movie movie) {

        // 1、执行保存
        movieService.saveMovie(movie);

        // 2、重定向到显示列表页面
        return "redirect:/show/list";
    }

    @RequestMapping("/edit/movie")
    public String editMovie(@RequestParam("movieId") String movieId, Model model) {

        // 1、根据 movieId 查询对应的 Movie 对象
        Movie movie = movieService.getMovieById(movieId);

        // 2、存入模型
        model.addAttribute("movie", movie);

        // 3、返回编辑数据的表单页面的逻辑视图名称
        return "movie-edit";
    }

    @RequestMapping("/update/movie")
    public String updateMovie(Movie movie) {

        // 1、执行更新
        movieService.updateMovie(movie);

        // 2、重定向到显示列表页面
        return "redirect:/show/list";
    }
}
